home *** CD-ROM | disk | FTP | other *** search
- /* ******************************************************************* */
- /* ** ** */
- /* ** ATUtilities Disk Transfer ** */
- /* ** Copright (C) 1992-1994 by Thomas Dreibholz ** */
- /* ** All rights reserved ** */
- /* ** ** */
- /* ******************************************************************* */
-
- #include <devices/trackdisk.h>
- #include "janus.h"
- #include "ATUtilities.h"
-
- #define BIT15 (1<<15)
- #define AMIGA 0
- #define PC720K 1
- #define PC144M 2
-
- struct UDevice
- {
- UBYTE Name[100];
- UWORD Unit;
- ULONG Heads;
- ULONG SectorsPerTrack;
- ULONG Tracks;
- UWORD Motor;
- UWORD DeviceType;
- BOOL File;
- };
-
- struct TDevice
- {
- BOOL Valid;
- ULONG Changes;
- struct FileHandle *FileHandle;
- struct IOStdReq *Request;
- struct MsgPort *Port;
- LONG Device;
- };
-
- struct UDevice ud[8]=
- {
- "trackdisk.device",0,2,11,80,4,0,FALSE,
- "trackdisk.device",1,2,11,80,4,0,FALSE,
- "trackdisk.device",2,2,22,80,4,0,FALSE,
- "M:File01",0,2,11,80,0,0,TRUE,
- "M:File02",0,3,11,80,0,0,TRUE,
- "mfm.device",0,2,9,80,4,PC720K,FALSE,
- "mfm.device",1,2,9,80,4,PC720K,FALSE,
- "mfm.device",2,2,18,80,4,PC144M,FALSE
- };
-
- struct TDevice td[8]=
- {
- TRUE,10000000L,NULL,NULL,NULL,-1L,
- TRUE,10000000L,NULL,NULL,NULL,-1L,
- TRUE,10000000L,NULL,NULL,NULL,-1L,
- TRUE,10000000L,NULL,NULL,NULL,-1L,
- TRUE,10000000L,NULL,NULL,NULL,-1L,
- TRUE,10000000L,NULL,NULL,NULL,-1L,
- TRUE,10000000L,NULL,NULL,NULL,-1L,
- TRUE,10000000L,NULL,NULL,NULL,-1L
- };
-
- UWORD Active;
- UWORD MotorCNT[8]={0,0,0,0,0,0,0,0};
-
- UBYTE *TransferPort="ATUtilities Disk Transfer";
- UBYTE *PrefsName="AT:Prefs/DiskTransfer.prefs";
- UBYTE *HelpName="AT:Help/DiskTransfer.help";
-
- struct JanusBase *JanusBase;
- struct Library *GfxBase;
- struct Library *IntuitionBase;
- struct Library *ATUtilitiesBase;
-
- struct Process *MotorTask;
- struct Task *MainTask;
- struct MsgPort *TaskPort,*ReplyPort;
- struct ExtSetupSig *ExtSetupSig;
- struct Window *WindowPtr;
- struct RastPort *rp;
- struct CommMemory *jhbyte,*jhword;
- struct AppManager *app;
- struct Message Message;
- struct Message *AppMessage;
-
- LONG JanusSignal;
- LONG PortSignal;
- LONG TaskSignal;
- ULONG JanusSignalMask;
- ULONG PortSignalMask;
- ULONG WaitSignalMask;
- ULONG TaskSignalMask;
- ULONG AppSignalMask;
- ULONG Signale;
-
- VOID HandleInt();
- VOID ShowInfo();
- VOID Motor();
- VOID EditiereLW();
- VOID ZeigeLW();
- BOOL EinstellungenAendern();
- VOID InstallAll();
- VOID UninstallAll();
- VOID InstallFile();
- VOID UninstallFile();
- VOID InstallDevice();
- VOID UninstallDevice();
- VOID OpenAll();
- VOID CloseAll();
- VOID Bearbeite();
- VOID BearbeiteFile();
- WORD ChangeCheck();
- VOID CalcFAT();
- VOID MotorOnOff();
- VOID Format();
- VOID Kopiere();
-
- UBYTE *mem;
- struct MsgPort *Port;
-
-
- /* Installationsroutine */
- VOID main()
- {
- REGISTER UWORD i;
- REGISTER BOOL bool;
-
- OpenAll();
- bool=FALSE;
- while(bool==FALSE)
- {
- Signale=Wait(WaitSignalMask);
- if(Signale & PortSignalMask)
- {
- i=Received(Port);
- switch(i)
- {
- case UTILITY_CALL:
- bool=EinstellungenAendern();
- break;
- case UTILITY_QUIT:
- bool=ExitWarning();
- break;
- case UTILITY_INFO:
- ShowInfo();
- break;
- case UTILITY_HELP:
- Help(HelpName,0);
- break;
- }
- }
- if(Signale & JanusSignalMask)
- {
- HandleInt();
- }
- if(Signale & TaskSignalMask)
- {
- for(i=0;i<8;i++)
- {
- if(MotorCNT[i]>0)
- {
- MotorCNT[i]--;
- if(MotorCNT[i]==0) MotorOnOff(i,0);
- }
- }
- }
- if(app!=NULL)
- {
- if(Signale & AppSignalMask)
- {
- AppMessage=GetMsg(app->Port);
- if(AppMessage!=NULL)
- {
- ReplyMsg(AppMessage);
- bool=EinstellungenAendern();
- }
- }
- }
- }
- CloseAll();
- }
-
-
- /* PC-Befehle ausführen */
- VOID HandleInt()
- {
- UWORD i,l;
-
- switch(jhword->Arg1)
- {
- case 1234:
- printf("> %ld %ld %ld\n",jhword->Arg2,jhword->Arg3,jhword->Arg4);
- break;
- case 1:
- if(ud[Active].File==FALSE)
- {
- MotorCNT[Active]=ud[Active].Motor;
- td[Active].Request->io_Data=mem;
- l=jhword->Arg2*512;
- if(ud[Active].DeviceType!=AMIGA)
- CopyMemQuick(&jhbyte->Memory,mem,l);
- else
- CopyMemQuick(&jhword->Memory,mem,l);
- td[Active].Request->io_Data=mem;
- td[Active].Request->io_Length=l;
- td[Active].Request->io_Offset=jhword->Arg3*512;
- td[Active].Request->io_Command=CMD_WRITE;
- i=DoIO(td[Active].Request);
- if(i!=0)
- {
- switch(i)
- {
- case 28:
- jhword->Arg2=0+BIT15;
- break;
- /* case 29:
- jhword->Arg2=15+BIT15;
- break; */
- default:
- jhword->Arg2=10+BIT15;
- break;
- }
- }
- else
- {
- jhword->Arg2=0;
- }
- }
- else
- {
- l=jhword->Arg2*512;
- Seek(td[Active].FileHandle,jhword->Arg3*512,OFFSET_BEGINNING);
- i=Write(td[Active].FileHandle,&jhbyte->Memory,l);
- if(i==l)
- {
- jhword->Arg2=0;
- }
- else
- {
- jhword->Arg2=10+BIT15;
- }
- }
- break;
- case 2:
- if(ud[Active].File==FALSE)
- {
- MotorCNT[Active]=ud[Active].Motor;
- td[Active].Request->io_Data=mem;
- l=jhword->Arg2*512;
- td[Active].Request->io_Length=l;
- td[Active].Request->io_Offset=jhword->Arg3*512;
- td[Active].Request->io_Command=CMD_READ;
- i=DoIO(td[Active].Request);
- if(i!=0)
- {
- switch(i)
- {
- /* case 29:
- jhword->Arg2=15+BIT15;
- break; */
- default:
- jhword->Arg2=11+BIT15;
- break;
- }
- }
- else
- {
- if(ud[Active].DeviceType!=AMIGA)
- CopyMemQuick(mem,&jhbyte->Memory,l);
- else
- CopyMemQuick(mem,&jhword->Memory,l);
- jhword->Arg2=0;
- }
- }
- else
- {
- l=jhword->Arg2*512;
- Seek(td[Active].FileHandle,jhword->Arg3*512,OFFSET_BEGINNING);
- i=Read(td[Active].FileHandle,&jhbyte->Memory,l);
- if(i==l)
- {
- jhword->Arg2=0;
- }
- else
- {
- jhword->Arg2=11+BIT15;
- }
- }
- break;
- case 3:
- if(ud[Active].File==FALSE)
- {
- MotorCNT[Active]=ud[Active].Motor;
- td[Active].Request->io_Command=CMD_UPDATE;
- i=DoIO(td[Active].Request);
- if(i!=0)
- {
- switch(i)
- {
- case 28:
- jhword->Arg2=0+BIT15;
- break;
- /* case 29:
- jhword->Arg2=15+BIT15;
- break; */
- default:
- jhword->Arg2=10+BIT15;
- break;
- }
- }
- else
- {
- jhword->Arg2=0;
- }
- }
- break;
- case 4:
- if(ud[Active].File==FALSE)
- {
- jhword->Arg2=ChangeCheck(Active);
- }
- else
- {
- jhword->Arg2=1;
- }
- break;
- case 5:
- jhword->Arg2=ud[Active].Tracks*ud[Active].Heads*ud[Active].SectorsPerTrack;
- jhword->Arg3=ud[Active].Tracks;
- jhword->Arg4=ud[Active].Heads;
- CalcFAT(Active);
- if(ud[Active].File==FALSE) jhword->Arg7=ud[Active].DeviceType; else jhword->Arg7=1000;
- break;
- case 6:
- for(i=0;i<8;i++)
- {
- MotorOnOff(i,1);
- }
- break;
- case 10:
- Format();
- break;
- case 20:
- Kopiere();
- break;
- case 100:
- if(td[jhword->Arg2].Valid==FALSE)
- {
- jhword->Arg2=2+BIT15;
- }
- else
- {
- Active=jhword->Arg2;
- jhword->Arg2=0;
- }
- break;
- default:
- break;
- }
- SendJanusInt(29);
- }
-
-
- /* Diskettenwechsel prüfen */
- WORD ChangeCheck(num)
- UWORD num;
- {
- REGISTER LONG i;
-
- td[num].Request->io_Command=TD_CHANGENUM;
- DoIO(td[num].Request);
- i=td[num].Request->io_Actual;
- if(i!=td[num].Changes)
- {
- td[num].Changes=i;
- return(0xFF);
- }
- return(1);
- }
-
-
- /* Laufwerke öffnen */
- VOID InstallAll()
- {
- REGISTER LONG i;
-
- for(i=0;i<8;i++)
- {
- if(ud[i].File==FALSE)
- {
- InstallDevice(i);
- }
- else
- {
- InstallFile(i);
- }
- }
- }
-
-
- /* Laufwerke schließen */
- VOID UninstallAll()
- {
- REGISTER LONG i;
-
- for(i=0;i<8;i++)
- {
- if(ud[i].File==FALSE)
- {
- UninstallDevice(i);
- }
- else
- {
- UninstallFile(i);
- }
- }
- }
-
-
- VOID InstallDevice(num)
- UWORD num;
- {
-
- td[num].Port=CreatePort(0L,0L);
- if(td[num].Port!=NULL)
- {
- td[num].Request=CreateExtIO(td[num].Port,200);
- if(td[num].Request!=NULL)
- {
- td[num].Device=OpenDevice(&ud[num].Name,ud[num].Unit,td[num].Request,0);
- if(td[num].Device!=0)
- {
- UninstallDevice(num);
- }
- }
- else
- {
- UninstallDevice(num);
- }
- }
- else
- {
- UninstallDevice(num);
- }
- }
-
-
- VOID UninstallDevice(num)
- UWORD num;
- {
-
- if(td[num].Valid==TRUE)
- {
- if(td[num].Device==0L) CloseDevice(td[num].Request);
- if(td[num].Request) DeleteExtIO(td[num].Request);
- if(td[num].Port) DeletePort(td[num].Port);
- td[num].Valid=FALSE;
- }
- }
-
-
- /* Datei installieren */
- VOID InstallFile(num)
- UWORD num;
- {
- REGISTER ULONG i,j;
- register struct FileLock *lock;
-
- td[num].Valid=FALSE;
- lock=Lock(&ud[num].Name,ACCESS_READ);
- if(lock!=NULL)
- {
- UnLock(lock);
- td[num].FileHandle=Open(&ud[num].Name,MODE_READWRITE);
- if(td[num].FileHandle!=NULL)
- {
- Seek(td[num].FileHandle,0,OFFSET_END);
- i=Seek(td[num].FileHandle,0,OFFSET_BEGINNING);
- j=512L*(ULONG)ud[num].Tracks*(ULONG)ud[num].Heads*(ULONG)ud[num].SectorsPerTrack;
- if(i!=j)
- {
- MultiRequest("Inkompatible Dateilänge bei LW-Datei",&ud[num].Name,"Okay",NULL);
- Close(td[num].FileHandle);
- }
- else
- {
- td[num].Valid=TRUE;
- }
- }
- }
- }
-
-
- VOID UninstallFile(num)
- UWORD num;
- {
-
- if(td[num].Valid==TRUE)
- {
- if(td[num].FileHandle) Close(td[num].FileHandle);
- td[num].Valid=FALSE;
- }
- }
-
-
- /* Installationsroutine */
- VOID OpenAll()
- {
- REGISTER UWORD i;
- register struct MsgPort *p;
- register struct FileHandle *fh;
-
- ATUtilitiesBase=OpenLibrary("at-utilities.library",0L);
- if(ATUtilitiesBase==NULL)
- {
- printf("Kann ATUtilities-Library nicht öffnen.\n");
- CloseAll();
- }
-
- GfxBase=OpenLibrary("graphics.library",0L);
- IntuitionBase=OpenLibrary("intuition.library",0L);
- if((GfxBase==NULL)||(IntuitionBase==NULL))
- {
- CloseAll();
- }
-
- p=FindPort(TransferPort);
- if(p!=NULL)
- {
- InfoRequest("ATUtilities Disk Transfer ist schon aktiv.");
- CloseAll();
- }
-
- MainTask=FindTask(NULL);
- SetTaskPri(MainTask,10);
-
- JanusBase=OpenLibrary("janus.library",0L);
- if(JanusBase==NULL)
- {
- ErrorRequest(ERROR_JANUS);
- CloseAll();
- }
-
- TaskSignal=AllocSignal(-1L);
- if(TaskSignal==-1L)
- {
- ErrorRequest(ERROR_SIGNAL);
- CloseAll();
- }
-
- Port=CreatePort(TransferPort,0L);
- if(Port==NULL)
- {
- ErrorRequest(ERROR_MPORT);
- CloseAll();
- }
-
- fh=Open(PrefsName,MODE_OLDFILE);
- if(fh!=NULL)
- {
- Read(fh,&ud,sizeof(struct UDevice)*8);
- Close(fh);
- }
-
- InstallAll();
-
- mem=AllocMem(PUBLIC_PAGESIZE,MEMF_CHIP|MEMF_CLEAR|MEMF_PUBLIC);
- if(mem==NULL)
- {
- ErrorRequest(ERROR_ALLOC);
- CloseAll();
- }
-
- ExtSetupSig=CreatePublicHandler(29);
- if(ExtSetupSig==NULL)
- {
- CloseAll();
- }
-
- TaskPort=CreatePort("Disk Transfer Motor Task <Stop>",0L);
- ReplyPort=CreatePort("Disk Transfer <Stop> Reply",0L);
- if((TaskPort==NULL)||(ReplyPort==NULL))
- {
- ErrorRequest(ERROR_PORT);
- CloseAll();
- }
-
- MotorTask=CreateProcess(Motor,500,"Disk Transfer Motor Task",2);
- if(MotorTask==NULL)
- {
- DeletePort(TaskPort);
- InfoRequest("Kann Motor-Task nicht erstellen.\n");
- CloseAll();
- }
-
- app=CreateAppItem("ATUtilities Disk Transfer");
- if(app!=NULL) AppSignalMask=app->SignalMask; else AppSignalMask=0;
-
- jhword=ExtSetupSig->WordAccess;
- jhbyte=ExtSetupSig->ByteAccess;
- PortSignal=Port->mp_SigBit;
- PortSignalMask=(1L<<PortSignal);
- JanusSignal=ExtSetupSig->JanusSignal;
- JanusSignalMask=ExtSetupSig->JanusSignalMask;
- TaskSignalMask=(1L<<TaskSignal);
- WaitSignalMask=PortSignalMask+JanusSignalMask+TaskSignalMask+AppSignalMask;
- }
-
-
- /* Programmende */
- VOID CloseAll()
- {
- if(app) DeleteAppItem(app);
- if(MotorTask!=NULL)
- {
- Message.mn_Node.ln_Type=NT_MESSAGE;
- Message.mn_ReplyPort=ReplyPort;
- PutMsg(TaskPort,&Message);
- WaitPort(ReplyPort);
- DeletePort(ReplyPort);
- }
- if(ExtSetupSig) DeletePublicHandler(ExtSetupSig);
- if(mem) FreeMem(mem,PUBLIC_PAGESIZE);
- if(TaskSignal!=-1) FreeSignal(TaskSignal);
- if(Port) DeletePort(Port);
- UninstallAll();
- if(ATUtilitiesBase) CloseLibrary(ATUtilitiesBase);
- if(GfxBase) CloseLibrary(GfxBase);
- if(IntuitionBase) CloseLibrary(IntuitionBase);
- if(JanusBase) CloseLibrary(JanusBase);
- exit(0);
- }
-
-
- /* Einstellungs-Fenster */
- BOOL EinstellungenAendern()
- {
- UBYTE text[40];
- BOOL bool,ende;
- REGISTER ULONG Class;
- REGISTER WORD i,j,id;
- register struct Window *win;
- register struct RastPort *rp;
- register struct Gadget *gad;
- register struct IntuiMessage *msg;
- register struct TextFont *opal;
-
- win=CreateStdWindow("ATUtilities - Disk Transfer Einstellungen",
- 75,75,460,142+BorderHeight(),CLOSEWINDOW|GADGETUP,
- ACTIVATE|WINDOWDEPTH|WINDOWDRAG|WINDOWCLOSE|GIMMEZEROZERO);
- ende=FALSE;
- if(win!=NULL)
- {
- rp=win->RPort;
- opal=GetOpalFont();
- SetFont(rp,opal);
-
- CreateBoolGadget(win,10,5,155,12,"Einstellungen Okay",1);
- CreateBoolGadget(win,170,5,155,12,"Programm beenden",2);
- CreateBoolGadget(win,335,5,50,12,"Info",3);
- CreateBoolGadget(win,390,5,50,12,"Hilfe",4);
- for(i=0,j=10;i<8;i++,j++)
- {
- sprintf(&text,"Laufwerk %ld:",i+1);
- CreateBoolGadget(win,33,25+(i*14),120,12,&text,j);
- CreateBoolGadget(win,10,25+(i*14),20,12,"!",i+100);
- ZeigeLW(rp,i);
- }
-
- bool=FALSE;
- while(bool==FALSE)
- {
- WaitPort(win->UserPort);
- msg=GetMsg(win->UserPort);
- Class=msg->Class;
- gad=msg->IAddress;
- ReplyMsg(msg);
- switch(Class)
- {
- case GADGETUP:
- id=gad->GadgetID;
- switch(id)
- {
- case 1:
- bool=TRUE;
- break;
- case 2:
- ende=TRUE; bool=TRUE;
- break;
- case 3:
- ShowInfo();
- break;
- case 4:
- Help(HelpName,0);
- break;
- default:
- if((id>=10)&&(id<=17))
- {
- j=id-10;
- EditiereLW(j);
- ZeigeLW(rp,j);
- }
- if((id>=100)&&(id<=107))
- {
- j=id-100;
- if(ud[j].File==FALSE)
- {
- if(td[j].Valid==TRUE)
- {
- Bearbeite(j);
- }
- else
- {
- MultiRequest("Dieses Device ist nocht nicht verfügbar.",
- "Bitte prüfen Sie die Einstellungen.","Okay",0L);
- }
- }
- else
- {
- BearbeiteFile(j);
- }
- }
- break;
- }
- break;
- case CLOSEWINDOW:
- bool=TRUE;
- break;
- }
- }
-
- DeleteStdWindow(win);
- }
- if(ende) ende=ExitWarning();
- return(ende);
- }
-
-
- VOID Type(win,typ)
- struct Window *win;
- UWORD typ;
- {
- REGISTER UBYTE *txt;
-
- switch(typ)
- {
- case AMIGA:
- txt="Normal";
- break;
- case PC720K:
- txt="720K DD";
- break;
- case PC144M:
- txt="1.44M HD";
- break;
- default:
- txt="Datei";
- break;
- }
- DrawCNTextBorder(win,280,5,100,12,txt);
- }
-
- /* Parameter ändern */
- VOID EditiereLW(num)
- UWORD num;
- {
- UBYTE text[10];
- BOOL ende,f;
- ULONG a,b,c,d;
- UWORD typ;
- REGISTER ULONG Class;
- REGISTER WORD i,j,id;
- UBYTE *bDevice,
- *bUnit,
- *bBlocksPerTrack,
- *bTracks,
- *bHeads,
- *bMotor;
- register struct Window *win;
- register struct RastPort *rp;
- register struct IntuiMessage *msg;
- register struct TextFont *opal;
- register struct Gadget *gad,*isFile;
- struct FileHandle *fh;
-
- win=CreateStdWindow("Laufwerksparameter editieren",
- 225,90,410,100+BorderHeight(),CLOSEWINDOW|GADGETUP,
- ACTIVATE|WINDOWDEPTH|WINDOWDRAG|WINDOWCLOSE|GIMMEZEROZERO);
- ende=FALSE;
- if(win!=NULL)
- {
- rp=win->RPort;
- opal=GetOpalFont();
- SetFont(rp,opal);
-
- CreateBoolGadget(win,10,5,100,12,"Okay",1);
- CreateBoolGadget(win,120,5,100,12,"Abbruch",2);
-
- CreateBoolGadget(win,250,5,25,12,"»",100);
- if(ud[num].File==TRUE)
- typ=1000;
- else
- typ=ud[num].DeviceType;
- Type(win,typ);
-
- bDevice=CreateStringGadget(win,120,20,260,10,&ud[num].Name,100,3);
- sprintf(&text,"%ld",ud[num].Unit);
- bUnit=CreateIntegerGadget(win,120,35,60,10,&text,4,4);
- sprintf(&text,"%ld",ud[num].Heads);
- bHeads=CreateIntegerGadget(win,320,35,60,10,&text,5,5);
- sprintf(&text,"%ld",ud[num].Tracks);
- bTracks=CreateIntegerGadget(win,120,47,60,10,&text,7,6);
- sprintf(&text,"%ld",ud[num].SectorsPerTrack);
- bBlocksPerTrack=CreateIntegerGadget(win,320,47,60,10,&text,5,7);
- sprintf(&text,"%ld",ud[num].Motor);
- bMotor=CreateIntegerGadget(win,320,64,60,10,&text,5,8);
-
- WriteText(rp,15,27,"Device/Datei:");
- WriteText(rp,15,42,"Unit:");
- WriteText(rp,220,42,"S/L-Köpfe:");
- WriteText(rp,15,54,"Spuren:");
- WriteText(rp,220,54,"Sekt./Spur:");
- WriteText(rp,15,72,"Motor-Ausschaltzeit nach x Sekunden:");
-
- ende=FALSE;
- while(ende==FALSE)
- {
- WaitPort(win->UserPort);
- msg=GetMsg(win->UserPort);
- Class=msg->Class;
- gad=msg->IAddress;
- ReplyMsg(msg);
- switch(Class)
- {
- case GADGETUP:
- id=gad->GadgetID;
- switch(id)
- {
- case 100:
- if(typ==1000)
- typ=0;
- else
- typ=typ+1;
- if(typ>PC144M) typ=1000;
- Type(win,typ);
- break;
- case 2:
- ende=TRUE;
- break;
- case 1:
- j=0;
- a=atol(bUnit);
- b=atol(bTracks);
- c=atol(bHeads);
- d=atol(bBlocksPerTrack);
- i=atol(bMotor);
- if(isFile->Flags & SELECTED) f=TRUE; else f=FALSE;
- if(b<2)
- { InfoRequest("Unzulässige Spurenanzahl."); j=1; }
- if(c<1)
- { InfoRequest("Unzulässige S/L-Kopfanzahl."); j++; }
- if(d<2)
- { InfoRequest("Unzulässige Anzahl von Sektoren/Spur."); j++; }
- if(i>180)
- { InfoRequest("Motor-Zeit nicht empfehlenswert (>180s)."); }
- if(j==0)
- {
- if(strcmp(&ud[num].Name,bDevice)) j=1;
- if(ud[num].Unit!=a) j=1;
- if(ud[num].Tracks!=b) j=1;
- if(ud[num].Heads!=c) j=1;
- if(ud[num].SectorsPerTrack!=d) j=1;
- strcpy(&ud[num].Name,bDevice);
- ud[num].Motor=i;
- ud[num].Unit=a;
- ud[num].Tracks=b;
- ud[num].Heads=c;
- ud[num].SectorsPerTrack=d;
- if(typ==1000)
- ud[num].File=TRUE;
- else
- {
- ud[num].File=FALSE;
- ud[num].DeviceType=typ;
- }
- if(j==1)
- {
- td[num].Valid=FALSE;
- MultiRequest("Um Probleme mit MS-DOS zu vermeiden, wird",
- "das Laufwerk erst nach einem Reset aktiv.",
- "Okay",NULL);
- }
- fh=Open(PrefsName,MODE_NEWFILE);
- if(fh!=NULL)
- {
- Write(fh,&ud,sizeof(struct UDevice)*8);
- Close(fh);
- }
- else
- {
- InfoRequest("Fehler beim Schreiben der Prefs-Datei.");
- }
- ende=TRUE;
- }
- break;
- }
- break;
- case CLOSEWINDOW:
- ende=TRUE;
- break;
- }
- }
- DeleteStdWindow(win);
- }
- }
-
-
- /* Parameter anzeigen */
- VOID ZeigeLW(rp,id)
- struct RastPort *rp;
- UWORD id;
- {
- UBYTE size[20];
- UBYTE text[30];
- REGISTER ULONG kb;
-
- kb=(ud[id].Heads*ud[id].Tracks*ud[id].SectorsPerTrack*512)/1024;
- if(kb>=10000)
- {
- sprintf(&size,"%ld MB",kb/1024);
- }
- else
- {
- sprintf(&size,"%ld KB",kb);
- }
- if(ud[id].File==FALSE)
- {
- sprintf(&text,"%s %s Unit %ld",
- &size,&ud[id].Name,ud[id].Unit);
- }
- else
- {
- sprintf(&text,"%s %s",&size,&ud[id].Name);
- }
- SetAPen(rp,0);
- RectFill(rp,158,23+(id*14),450,36+(id*14));
- SelectStdFPen(rp);
- WriteText(rp,160,33+(id*14),&text);
- }
-
-
- /* Device-Laufwerk bearbeiten */
- VOID Bearbeite(num)
- UWORD num;
- {
- UBYTE text[40];
- REGISTER BOOL ende,bool;
- REGISTER ULONG Class;
- REGISTER WORD i,j,id;
- register struct Window *win;
- register struct RastPort *rp;
- register struct Gadget *gad;
- register struct IntuiMessage *msg;
- register struct TextFont *opal;
- register struct Gadget *verify;
- BOOL v;
- ULONG BytesPerTrack;
- ULONG Track;
- UBYTE *FormatMemory;
-
- win=CreateStdWindow("Speichermedium bearbeiten",
- 225,90,310,66+BorderHeight(),CLOSEWINDOW|GADGETUP,
- ACTIVATE|WINDOWDEPTH|WINDOWDRAG|WINDOWCLOSE|GIMMEZEROZERO);
- ende=FALSE;
- if(win!=NULL)
- {
- rp=win->RPort;
- opal=GetOpalFont();
- SetFont(rp,opal);
-
- CreateBoolGadget(win,10,5,100,12,"Okay",1);
- CreateBoolGadget(win,10,20,119,12,"Hard-Format",2);
- CreateBoolGadget(win,10,34,172,12,"Prüfe auf Fehler",3);
- verify=CreateSToggleGadget(win,132,20,50,12,"Verify",100);
- DrawNTextBorder(win,10,48,280,12,"Kein Fehler aufgetreten.");
- DrawNTextBorder(win,190,20,100,12,"0");
- DrawNTextBorder(win,190,34,100,12,"0 %");
-
- ende=FALSE;
- while(ende==FALSE)
- {
- WaitPort(win->UserPort);
- msg=GetMsg(win->UserPort);
- Class=msg->Class;
- gad=msg->IAddress;
- ReplyMsg(msg);
- switch(Class)
- {
- case GADGETUP:
- id=gad->GadgetID;
- switch(id)
- {
- case 2:
- case 3:
- DrawCNTextBorder(win,10,48,280,12,"Kein Fehler aufgetreten.");
- if(verify->Flags & SELECTED) v=TRUE; else v=FALSE;
- if(id==3)
- {
- bool=MultiRequest("Wollen Sie den Datenträger auf",
- "Fehler überprüfen ?",
- "Ja, Prüfen","Nein, Zurück");
- }
- else
- {
- bool=MultiRequest("Hard-Format: Alle Daten werden gelöscht!",
- "Sind Sie wirklich sicher ?",
- "Ja, Format","NEIN! Zurück");
- }
- if(bool==TRUE)
- {
- MotorCNT[num]=5;
- BytesPerTrack=ud[num].SectorsPerTrack*ud[num].Heads*512;
- FormatMemory=AllocMem(BytesPerTrack,MEMF_CHIP|MEMF_CLEAR|MEMF_PUBLIC);
- if(FormatMemory!=NULL)
- {
- SetDrMd(rp,JAM2);
- j=0;
- for(Track=0;Track<ud[num].Tracks;Track++)
- {
- sprintf(&text," %ld ",Track);
- DrawNTextBorder(win,190,20,100,12,&text);
- sprintf(&text," %3ld %% ",((Track*100)/(ud[num].Tracks-1)));
- DrawNTextBorder(win,190,34,100,12,&text);
- if(ud[num].File==FALSE)
- {
- if(id==3)
- {
- td[num].Request->io_Data=FormatMemory;
- td[num].Request->io_Length=BytesPerTrack;
- td[num].Request->io_Offset=Track*BytesPerTrack;
- td[num].Request->io_Command=CMD_READ;
- i=DoIO(td[num].Request);
- if(i!=0)
- {
- if(i==29)
- {
- InfoRequest("Das Medium ist nicht eingelegt.");
- Track=ud[num].Tracks;
- }
- else
- {
- sprintf(&text,"Fehler #%ld auf Track %ld.",i,Track);
- DrawCNTextBorder(win,10,48,280,12,&text);
- }
- j++;
- }
- }
- else
- {
- td[num].Request->io_Data=FormatMemory;
- td[num].Request->io_Length=BytesPerTrack;
- td[num].Request->io_Offset=Track*BytesPerTrack;
- td[num].Request->io_Command=TD_FORMAT;
- i=DoIO(td[num].Request);
- if(i!=0)
- {
- sprintf(&text,"Format: Fehler #%ld auf Track %ld.",i,Track);
- DrawCNTextBorder(win,10,48,280,12,&text);
- j++;
- if(i==28)
- {
- InfoRequest("Das Medium ist schreibgeschützt.");
- Track=ud[num].Tracks;
- }
- else if(i==29)
- {
- InfoRequest("Das Medium ist nicht eingelegt.");
- Track=ud[num].Tracks;
- }
- }
- if((v==TRUE)&&(Track<ud[num].Tracks))
- {
- td[num].Request->io_Data=FormatMemory;
- td[num].Request->io_Length=BytesPerTrack;
- td[num].Request->io_Offset=Track*BytesPerTrack;
- td[num].Request->io_Command=CMD_READ;
- i=DoIO(td[num].Request);
- if(i!=0)
- {
- sprintf(&text,"Verify: Fehler #%ld auf Track %ld.",i,Track);
- DrawCNTextBorder(win,10,48,280,12,&text);
- j++;
- }
- }
- }
- }
- }
- if(j==0)
- {
- if(id==3) InfoRequest("Der Datenträger ist fehlerfrei.");
- }
- else
- {
- if(id==3)
- {
- sprintf(&text,"%ld Fehler gefunden worden.",j);
- MultiRequest("Bei der Überprüfung sind",&text,"Okay",NULL);
- }
- else
- {
- sprintf(&text,"%ld Fehler aufgetreten.",j);
- MultiRequest("Bei der Formatierung sind",&text,"Okay",NULL);
- }
- }
- FreeMem(FormatMemory,BytesPerTrack);
- }
- }
- break;
- case 1:
- ende=TRUE;
- break;
- }
- break;
- case CLOSEWINDOW:
- ende=TRUE;
- break;
- }
- }
- DeleteStdWindow(win);
- }
- }
-
-
- /* FAT berechnen */
- VOID CalcFAT(num)
- UWORD num;
- {
- REGISTER UWORD anz,i;
- REGISTER ULONG bytes,plus,sek,spc;
-
-
- sek=ud[num].Tracks*ud[num].Heads*ud[num].SectorsPerTrack;
- if(sek>4096)
- {
- bytes=sek*2; /* FAT 16-Bit */
- }
- else
- {
- bytes=(sek*3)/2; /* FAT 12-Bit */
- }
- plus=0;
- anz=0;
- for(i=0;i<32000;i++)
- {
- if(plus>=bytes)
- {
- spc=1;
- if(anz>15)
- {
- do
- {
- spc=spc*2;
- anz=anz/2;
- } while(anz>15);
- }
- jhword->Arg5=anz;
- jhbyte->Arg6=spc;
- return;
- }
- else
- {
- plus+=512;
- anz++;
- }
- }
- }
-
-
- /* File-Laufwerk bearbeiten */
- VOID BearbeiteFile(num)
- UWORD num;
- {
- UBYTE text[35];
- REGISTER BOOL bool;
- REGISTER UBYTE *mem;
- REGISTER ULONG i,j,k,l;
- register struct FileHandle *fh;
- register struct Window *win;
- register struct RastPort *rp;
- struct TextFont *opal;
- struct IntuiMessage *msg;
-
- if(td[num].Valid==FALSE)
- {
- bool=MultiRequest("Es existiert keine Laufwerksdatei.",
- "Möchten Sie eine erstellen ?",
- "Ja, Erstellen","Nein, Zurück");
- if(bool==TRUE)
- {
- j=512*ud[num].SectorsPerTrack*ud[num].Heads;
- mem=AllocMem(j,MEMF_CLEAR|MEMF_PUBLIC);
- if(mem!=NULL)
- {
- fh=Open(&ud[num].Name,MODE_NEWFILE);
- if(fh!=NULL)
- {
- win=CreateStdWindow("Laufwerksdatei erstellen",
- 75,90,310,30+BorderHeight(),GADGETUP|CLOSEWINDOW,
- WINDOWCLOSE|WINDOWDEPTH|ACTIVATE|WINDOWDRAG|GIMMEZEROZERO);
- if(win!=NULL)
- {
- opal=GetOpalFont();
- rp=win->RPort;
- SetFont(rp,opal);
- CreateBoolGadget(win,10,5,120,12,"Stop!",1);
- bool=FALSE;
- if(win!=NULL)
- {
- for(i=0;i<ud[num].Tracks;i++)
- {
- sprintf(&text,"Track %ld von %ld",i,ud[num].Tracks);
- DrawCNTextBorder(win,140,5,150,12,&text);
- k=Write(fh,mem,j);
- if(k!=j)
- {
- InfoRequest("Schreibfehler!");
- i=ud[num].Tracks;
- bool=TRUE;
- }
- msg=GetMsg(win->UserPort);
- if(msg!=NULL)
- {
- InfoRequest("Stop!");
- i=ud[num].Tracks;
- bool=TRUE;
- }
- }
- if(bool==FALSE)
- {
- td[num].FileHandle=fh;
- td[num].Valid=TRUE;
- }
- else
- {
- Close(fh);
- DeleteFile(&ud[num].Name);
- }
- }
- DeleteStdWindow(win);
- }
- else
- {
- Close(fh);
- DeleteFile(&ud[num].Name);
- ErrorRequest(ERROR_ALLOC);
- }
- }
- else InfoRequest("Laufwerksdatei läßt sich nicht erstellen.");
- FreeMem(mem,j);
- }
- else ErrorRequest(ERROR_ALLOC);
- }
- }
- else
- {
- win=CreateStdWindow("Laufwerksdatei-Information",75,90,310,70+BorderHeight(),
- CLOSEWINDOW|GADGETUP,
- WINDOWCLOSE|WINDOWDEPTH|WINDOWDRAG|ACTIVATE|GIMMEZEROZERO);
- if(win!=NULL)
- {
- opal=GetOpalFont();
- rp=win->RPort;
- SetFont(rp,opal);
- CreateBoolGadget(win,10,5,120,12,"Okay",1);
-
- sprintf(&text,"Spuren: %ld",ud[num].Tracks);
- DrawNTextBorder(win,10,20,280,12,&text);
- sprintf(&text,"S/L-Köpfe: %ld",ud[num].Heads);
- DrawNTextBorder(win,10,35,280,12,&text);
- sprintf(&text,"Sektoren/Spur: %ld",ud[num].SectorsPerTrack);
- DrawNTextBorder(win,10,50,280,12,&text);
- sprintf(&text,"KBytes: %ld",(ud[num].Tracks*ud[num].SectorsPerTrack*ud[num].Heads)/2);
- DrawNTextBorder(win,10,65,280,12,&text);
-
- WaitPort(win->UserPort);
- DeleteStdWindow(win);
- }
- }
- }
-
-
- /* Motor-Kontrollprozeß */
- VOID Motor()
- {
- register struct Message *msg;
-
- geta4();
- do
- {
- Delay(50);
- Signal(MainTask,TaskSignalMask);
- msg=GetMsg(TaskPort);
- }
- while(msg==NULL);
- DeletePort(TaskPort);
- ReplyMsg(msg);
- Exit(0);
- }
-
-
- /* Motor ein- und ausschalten */
- VOID MotorOnOff(num,status)
- UWORD num;
- UWORD status;
- {
-
- if(td[num].Valid==TRUE)
- {
- if(ud[num].File==FALSE)
- {
- td[num].Request->io_Command=TD_MOTOR;
- td[num].Request->io_Length=status;
- SendIO(td[num].Request);
- if(status) MotorCNT[num]=ud[num].Motor;
- }
- }
- }
-
-
- /* Datenträger formatieren */
- VOID Format()
- {
- REGISTER ULONG tSize;
- REGISTER UBYTE *fBuffer;
- REGISTER UWORD res,i;
-
- res=0;
- if(ud[Active].File==FALSE)
- {
- tSize=512*ud[Active].SectorsPerTrack*ud[Active].Heads;
- fBuffer=AllocMem(tSize,MEMF_CHIP|MEMF_CLEAR|MEMF_PUBLIC);
- if(fBuffer!=NULL)
- {
- td[Active].Request->io_Data=fBuffer;
- td[Active].Request->io_Length=tSize;
- td[Active].Request->io_Offset=jhword->Arg2*tSize;
- td[Active].Request->io_Command=TD_FORMAT;
- i=DoIO(td[Active].Request);
- if(i==0)
- {
- if(jhword->Arg3==1)
- {
- td[Active].Request->io_Command=CMD_READ;
- i=DoIO(td[Active].Request);
- if(i!=0) res=3;
- }
- } else res=2;
- MotorCNT[Active]=ud[Active].Motor;
- FreeMem(fBuffer,tSize);
- }
- else res=1;
- }
- jhword->Arg2=res;
- }
-
-
- /* Datenträger kopieren */
- VOID Kopiere()
- {
- REGISTER ULONG tSize;
- REGISTER UBYTE *fBuffer;
- REGISTER UWORD res,i;
-
- res=0;
- tSize=512*ud[Active].SectorsPerTrack*ud[Active].Heads;
- fBuffer=AllocMem(tSize,MEMF_CHIP|MEMF_CLEAR|MEMF_PUBLIC);
- if(fBuffer!=NULL)
- {
- if(ud[Active].File==FALSE)
- {
- td[Active].Request->io_Data=fBuffer;
- td[Active].Request->io_Length=tSize;
- td[Active].Request->io_Offset=jhword->Arg2*tSize;
- td[Active].Request->io_Command=CMD_READ;
- i=DoIO(td[Active].Request);
- }
- else
- {
- Seek(td[Active].FileHandle,jhword->Arg2*tSize,OFFSET_BEGINNING);
- i=Read(td[Active].FileHandle,fBuffer,tSize);
- if(i!=tSize) i=1; else i=0;
- }
- if(i==0)
- {
- if(ud[jhword->Arg3].File==FALSE)
- {
- td[jhword->Arg3].Request->io_Data=fBuffer;
- td[jhword->Arg3].Request->io_Length=tSize;
- td[jhword->Arg3].Request->io_Offset=jhword->Arg2*tSize;
- td[jhword->Arg3].Request->io_Command=TD_FORMAT;
- i=DoIO(td[jhword->Arg3].Request);
- if(i==0)
- {
- if(jhword->Arg4==1)
- {
- td[jhword->Arg3].Request->io_Command=CMD_READ;
- i=DoIO(td[jhword->Arg3].Request);
- if(i!=0) res=4;
- }
- } else res=3;
- }
- else
- {
- Seek(td[jhword->Arg3].FileHandle,jhword->Arg2*tSize,OFFSET_BEGINNING);
- i=Write(td[jhword->Arg3].FileHandle,fBuffer,tSize);
- if(i!=tSize) res=3;
- }
- } else res=2;
- MotorCNT[Active]=ud[Active].Motor;
- MotorCNT[jhword->Arg3]=ud[jhword->Arg3].Motor;
- FreeMem(fBuffer,tSize);
- } else res=1;
- jhword->Arg2=res;
- }
-
-
- /* Information */
- VOID ShowInfo()
- {
- InformationBox("ATUtilities Disk Transfer - Information",
- "$VER: Disk Transfer - Version 4.0",
- "Copyright (C) 1992-1994 by",
- "Thomas Dreibholz",
- "All rights reserved.",
- "AT:Icons/Utility");
- }
-
-